/*
Copyright (C) 2008 raohmaru <http://www.raohmaru.com>

This file is part of Raohmaru AS3 Framework.

Raohmaru AS3 Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Raohmaru AS3 Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Raohmaru AS3 Framework.  If not, see <http://www.gnu.org/licenses/>.
*/

package jp.raohmaru.net.statistics 
{
import flash.events.*;
import flash.net.*;

/**
 * Se distribuye tras decodificar y colocar todos los datos recibidos en la propiedad data del objeto URLLoader. Es posible acceder a los datos recibidos
 * una vez distribuido este evento. 
 * @eventType flash.events.Event.COMPLETE
 */
[Event(name="complete", type="flash.events.Event") ]

/**
 * Se distribuye cuando se produce un error de entrada o salida que provoca que una operación de carga se realice incorrectamente.
 * @eventType flash.events.IOErrorEvent.IO_ERROR
 */
[Event(name="ioError", type="flash.events.IOErrorEvent") ]

/**
 * Se distribuye cuando se realiza una solicitud de red a través de HTTP y Flash Player puede detectar el código de estado HTTP.
 * @eventType flash.events.HTTPStatusEvent.HTTP_STATUS
 */
[Event(name="httpStatus", type="flash.events.HTTPStatusEvent") ]

/**
 * Se distribuye si se intenta cargar datos de un servidor situado fuera del entorno limitado de seguridad.
 * @eventType flash.events.SecurityErrorEvent.SECURITY_ERROR
 */
[Event(name="securityError", type="flash.events.SecurityErrorEvent") ]

/**
 * La clase SimpleMedition envía datos a una URL con el objeto de ser registrados para una estadística.
 * @example
<listing version="3.0">
import flash.net.URLRequestMethod;import flash.net.URLVariables;import jp.raohmaru.net.statistics.SimpleMedition;

var med : SimpleMedition = new SimpleMedition();
	med.url = "http://www.example.org/test.php";	med.method = URLRequestMethod.POST;	med.log = true;
	med.addEventListener(Event.COMPLETE, onLoadComplete);var variables:URLVariables = new URLVariables();
variables.page = "home";med.send(variables);

function onSend(e : Event) : void
{	
	
}</listing>
 * @author raohmaru
 * @version 1.0.1
 */
public class SimpleMedition extends EventDispatcher implements IMedition
{
	private var _url : String,
				_enabled : Boolean = true,
				_method : String = URLRequestMethod.GET,
				_log : Boolean = false;

	/**
	 * La URL que se va a solicitar.
	 * @see flash.net.URLRequest
	 */
	public function get url() : String
	{
		return _url;
	}
	public function set url(value : String) : void
	{
		_url = value;
	}
	
	/**
	 * Define o obtiene el estado de la instancia SimpleMedition. Si es <code>false</code>, se desactivarán las llamadas a <code>SimpleMedition.send()</code>
	 * @default true
	 */
	public function get enabled() : Boolean
	{
		return _enabled;
	}
	public function set enabled(value : Boolean) : void
	{
		_enabled = value;
	}

	/**
	 * Define o obtiene si el método de envío HTTP es una operación GET o POST. 
	 * @default URLRequestMethod.GET
	 * @see flash.net.URLRequestMethod
	 */
	public function get method() : String
	{
		return _method;
	}	
	public function set method(value : String) : void
	{
		_method = value;
	}
	
	/**
	 * Define si debe mostrarse el estado cada petición realizada con <code>SimpleMedition.send()</code> en la consola de salida.
	 * @default false
	 */
	public function get log() : Boolean
	{
		return _log;
	}
	public function set log(value : Boolean) : void
	{
		_log = value;
	}
	

	
	/**
	 * Crea una nueva instancia de SimpleMedition.
	 * @param url La URL que se va a solicitar
	 */
	public function SimpleMedition(url : String = null)
	{
		_url = url;
	}
	
	/**
	 * Envía una petición al servidor.
	 * @param data Datos a enviar junto a la petición.
	 * @see flash.net.URLLoader
	 * @example
	 <listing version="3.0">
	 import jp.raohmaru.net.statistics.SimpleMedition;
	 
	 var med : SimpleMedition = new SimpleMedition();
	 med.url = "http://www.example.org/medreg.php";	 med.send("page=descargas&st=5");</listing>
	 */
	public function send(data : Object) : void
	{
		if(!enabled) return;
		
		if(_log)
		{
			trace("SimpleMedition.send()");
			for(var i:String in data)
				trace("  [ " + i + ": " + data[i] + " ]");
		}
					
		var request : URLRequest = new URLRequest(_url);
			request.data = data;
			request.method = _method;
			
		var loader : URLLoader = new URLLoader();
			loader.addEventListener(Event.COMPLETE, onSend);
			loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, onSend);
			loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSend);
			loader.addEventListener(IOErrorEvent.IO_ERROR, onSend);
			loader.load(request);
	}
	
	private function onSend(e : Event) : void
	{
		if(e.type == HTTPStatusEvent.HTTP_STATUS)
		{
			if(_log) trace("\t-> HTTP_STATUS: " + HTTPStatusEvent(e).status);
		}
		else if(e.type == Event.COMPLETE)
		{
			if(_log)
			{
				trace("\t-> Send ok!");
				trace("\t\t+> Response: " + e.target.data);
			}
		}
		else
		{
			if(_log) trace("\t-> An error ocurred ("+e.type+")");
		}
		
		dispatchEvent(e);
	}
}
}